home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / firebird_bo.nasl < prev    next >
Text File  |  2005-01-14  |  5KB  |  207 lines

  1. #
  2. # Copyright (C) 2004 Tenable Network Security
  3. #
  4.  
  5. if(description)
  6. {
  7.  script_id(12246);
  8.  script_version ("$Revision: 1.3 $");
  9.  name["english"] = "Firebird DB remote buffer overflow";
  10.  script_name(english:name["english"]);
  11.  desc["english"] =
  12. "The remote host is vulnerable to a remote stack-based
  13. overflow.  An attacker, exploiting this hole, would be
  14. given full access to the target machine.  Versions of
  15. Firebird database less than 1.5.0 are reported vulnerable
  16. to this overflow.
  17.  
  18. See also : http://www.securiteam.com/unixfocus/5AP0P0UCUO.html
  19. Solution : Upgrade to version 1.5.0 or higher
  20.  
  21. Risk factor : High";
  22.  
  23.  script_description(english:desc["english"]);
  24.  
  25.  summary["english"] = "Firebird DB remote buffer overflow";
  26.  script_summary(english:summary["english"]);
  27.  
  28.  script_category(ACT_MIXED_ATTACK);
  29.  
  30.  script_copyright(english:"This script is Copyright (C) 2004 Tenable Network Security");
  31.  family["english"] = "Remote file access";
  32.  script_family(english:family["english"]);
  33.  script_dependencie("find_service.nes");
  34.  script_require_ports(3050,139,445);
  35.  exit(0);
  36. }
  37.  
  38.  
  39. # start script
  40.  
  41.  
  42. DEBUG = 0;
  43. include("smb_nt.inc");
  44.  
  45. function firebird_request(myuser,myfile, ptype)
  46. {
  47.     req = req2 = NULL;
  48.     opcode = raw_string(0x00,0x00,0x00,0x01);
  49.     stuff1 = raw_string(0x00,0x00,0x00,0x13,0x00,0x00,
  50.                         0x00,0x02,0x00,0x00,0x00,0x1d,
  51.                             0x00,0x00,0x00);
  52.  
  53.     myfilelen = raw_string(strlen(myfile));
  54.            stuff2 = raw_string(0x00,0x00,0x00,0x00,0x00,0x00,
  55.                         0x02,0x00,0x00,0x00,0x1a,0x01);
  56.  
  57.     name = string("SCAN CHECK");
  58.     name += raw_string(0x04);
  59.     mynamelen = raw_string(strlen(name));
  60.     machinename = string("nessusscan");
  61.     mymachinelen = raw_string(strlen(machinename));
  62.  
  63.         req = opcode + stuff1 + myfilelen + myfile + stuff2 + mynamelen +
  64.               name + mymachinelen + machinename;
  65.  
  66.     req += raw_string(0x06,0x00,0x00,0x00,0x00,0x00,0x00,
  67.                           0x08,0x00,0x00,0x00,0x01,0x00,0x00,
  68.                           0x00,0x02,0x00,0x00,0x00,0x03,0x00,
  69.                   0x00,0x00,0x02,0x00,0x00,0x00,0x0a,
  70.                           0x00,0x00,0x00,0x01,0x00,0x00,0x00,
  71.                   0x02,0x00,0x00,0x00,0x03,0x00,0x00,
  72.                           0x00,0x04);
  73.  
  74.     if (ptype == "attach")
  75.     {
  76.          opcode = raw_string(0x00,0x00,0x00,0x13);
  77.         stuff1 = raw_string(0x00,0x00,0x00,0x00,0x00,0x00,0x00);
  78.                 myfilelen = raw_string(strlen(myfile));
  79.         stuff2 = raw_string(0x00,0x00,0x00,0x00,0x00,0x00,0x20,
  80.                                     0x01,0x1c);
  81.         myuserlen = raw_string(strlen(myuser), 0x1e);
  82.          stuff3 = string("yWIQESaQ6ty");
  83.         stuff4 = raw_string(0x3a,0x04,0x00,0x00,0x00,0x00,0x3e,0x00);    
  84.         req2 = opcode + stuff1 + myfilelen + myfile + stuff2 + myuserlen +
  85.               myuser + stuff3 + stuff4;
  86.     }
  87.             
  88.                 
  89.         soc = open_sock_tcp(port);
  90.         if (! soc)
  91.     {
  92.             return("ERROR"); 
  93.         if (DEBUG)
  94.         {
  95.             display("can't open a socket to remote host\n");
  96.         }
  97.     }
  98.  
  99.         send(socket:soc, data:req);
  100.  
  101.     if (ptype == "attach")
  102.     {
  103.         r = recv(socket:soc, length:16);
  104.         if ( r && (ord(r[3]) == 3) )
  105.         {
  106.             send(socket:soc, data:req2);
  107.         }
  108.         else
  109.         {
  110.             close(soc);
  111.  
  112.             if (DEBUG)
  113.             {
  114.                 display("did not receive a reply after connect packet\n");
  115.             }
  116.  
  117.             return("ERROR");
  118.         }
  119.     }
  120.  
  121.     r = recv(socket:soc, length:16);
  122.  
  123.     close(soc);
  124.  
  125.     if (strlen(r) > 4)
  126.     {
  127.         return(r);
  128.     }
  129.     else
  130.     {
  131.         if (DEBUG)
  132.         {
  133.             display(string("recv only returned ", strlen(r), " bytes\n"));
  134.         }
  135.         return("ERROR");
  136.     }
  137. }
  138.             
  139.             
  140.  
  141.     
  142.  
  143.  
  144. port = 3050;
  145. if (! get_tcp_port_state(port) )
  146.     exit(0);
  147.  
  148. reply = firebird_request(myfile:"nessusr0x", ptype:"connect");
  149.  
  150. if (reply == "ERROR")
  151.     exit(0);
  152.  
  153. if (  ( ord(reply[0]) == 0) &&
  154.       ( ord(reply[1]) == 0) &&
  155.       ( ord(reply[2]) == 0) &&
  156.       ( ord(reply[3]) == 3)   ) 
  157. {
  158.     mywarning = string("The remote host seems to be running the Firebird database server\n");
  159.     security_note(port:port, data:mywarning);
  160. }
  161.  
  162.  
  163. if ( safe_checks() )
  164. {
  165.     # patched systems will *not* respond to a 299 byte filename request 
  166.     reply = firebird_request(myuser:"nessusr0x" ,myfile:string(crap(299)), ptype:"attach");
  167.     
  168.     if (reply == "ERROR")
  169.         exit(0);
  170.  
  171.     if (strlen(reply) > 0)
  172.     {
  173.         security_hole(port);
  174.         exit(0);
  175.     }
  176.  
  177. }
  178. else
  179. {
  180.     reply = firebird_request(myuser:"nessusr0x" ,myfile:string(crap(300)), ptype:"attach");
  181.     if (DEBUG)
  182.     {
  183.         display("sent malicious attach packet\n");
  184.     }
  185.  
  186.     reply = firebird_request(myfile:"nessusr0x", ptype:"connect");
  187.  
  188.     if (DEBUG)
  189.     {
  190.         display("sending final connect request to DB\n");
  191.     }
  192.  
  193.     if (reply == "ERROR")
  194.     {
  195.         security_hole(port);
  196.         exit(0);
  197.     }
  198. }
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.